/**  
 * @Project: Dawn
 * @Title: ReflectTest.java
 * @Package util
 * @Description: Demo for Java Reflect
 * @author yanglei yanglei1@funshion.com
 * @date 2014年12月9日 上午9:59:12
 * @Copyright: 2014 funshion.com. All rights reserved.
 * @version V1.0  
 */
package util;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;


/**
 * @ClassName ReflectTest
 * @Description Demo for Java Reflect
 * @author yanglei1 yanglei1@funshion.com
 * @date 2014年12月9日
 */
public class ReflectTest {
	
	/**
	 * 1, 通过反射获取类名和类所在的报名
	 */
	public static void getPackageClassNameDemo() {
		Person zhangsan = new Person();
		System.out.println("包名 : " + zhangsan.getClass().getPackage()
				+ " \n类名 : " + zhangsan.getClass().getName());
	}
	
	/**
	 * 2, 验证所有的类都是Class类的实例对象 
	 * @throws ClassNotFoundException
	 */
	public static void allClassInstance() throws ClassNotFoundException {
		//定义两个类型未知的class，初始值为null
		Class<?> clazz1 = null;
		Class<?> clazz2 = null;
		//(写法1,推荐写法) 通过Class.forName方法给classz实例化为Person对象
		clazz1 = Class.forName("util.Person");
		System.out.println("包名 : " + clazz1.getClass().getPackage()
				+ " \n类名 : " + clazz1.getClass().getName());
		System.out.println("包名 : " + clazz1.getPackage()
				+ " \n类名 : " + clazz1.getName());
		
		//写法2
		clazz2 = Person.class;
		System.out.println("包名 : " + clazz2.getClass().getPackage()
				+ " \n类名 : " + clazz2.getClass().getName());
		System.out.println("包名 : " + clazz1.getPackage()
				+ " \n类名 : " + clazz1.getName());
	}
	
	/**
	 * 3, 通过反射机制，用Class创建对象
	 * @throws ClassNotFoundException
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 */
	public static void instanceClass() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
		Class<?> clazz = null;
		clazz = Class.forName("util.Person");
		//注：因为实例化时无法传递参数，所以需要创建无参的构造函数，以便通过反射机制来实例化对象
		Person person = (Person) clazz.newInstance();
		person.setAge(20);
		person.setName("lili");
		System.out.println(person.toString());
		
	}
	
	/**
	 * 4, 通过反射机制，获取一个类的构造方法
	 * @throws ClassNotFoundException
	 * @throws IllegalArgumentException
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 */
	public static void getConstructor() throws ClassNotFoundException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {
		Class<?> clazz = null;
		Person person1 = null;
		Person person2 = null;
		clazz = Class.forName("util.Person");
		//通过反射得到一个类的所有构造方法
		Constructor<?>[] constructors = clazz.getConstructors();
		System.out.println(constructors.length);
		//通过反射获取的构造方法来实例化类的对象
		person1 = (Person) constructors[0].newInstance();
		person1.setAge(18);
		person1.setName("shuangshuang");
		System.out.println(person1.toString() + "\n\n");
	}

	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
		// get class package name demo
		getPackageClassNameDemo();
		System.out.println("\n\n");
		
		// Demo2
		allClassInstance();
		System.out.println("\n\n");
		
		// Demo3 通过Class创建对象
		instanceClass();
		System.out.println("\n\n");
	}
}
